package com.example.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.example.pojo.Result;
import com.example.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *  阻拦器 Interceptor 由spring提供需要配置文件 Config
 * 可以和Web提供的过滤器共存
 */

//交由Bean容器管理
@Component
@Slf4j
//需要实现 HandlerInterceptor 接口
public class LogincheckInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        log.info("拦截器生效......");

        //获取请求的url
        String url = request.getRequestURI().toString();

        //获取请求头中token的值（令牌）
        String jwt = request.getHeader("token");

        //判断令牌是否存在
        if(!StringUtils.hasLength(jwt)){

            log.info("无令牌--");
            //返回错误信息
            Result R1 =  Result.error("NOT_LOGIN");
            //使用工具类将Result(错误信息)转换成json格式的字符串
            String notlogin = JSONObject.toJSONString(R1);
            //通过流将转换为json格式的字符串传递到前端
            response.getWriter().write(notlogin);
            return false;

        }

        //解析jwt令牌是否合法
        try {
            JwtUtils.parseJwt(jwt);
        }
        catch (Exception e){
            e.printStackTrace();
            log.info("解析令牌失败（令牌超时或错误）");
            //返回错误信息
            Result R1 =  Result.error("NOT_LOGIN");
            //使用工具类将Result(错误信息)转换成json格式的字符串
            String notlogin = JSONObject.toJSONString(R1);
            //通过流将转换为json格式的字符串传递到前端
            response.getWriter().write(notlogin);
            return false;
        }

        //令牌验证通过 放行请求
        log.info("令牌验证通过 放行");
        return true;

    }


}
